home *** CD-ROM | disk | FTP | other *** search
/ Total Network Tools 2002 / NextStepPublishing-TotalNetworkTools2002-Win95.iso / Archive / Misc Servers / Zope.exe / SQLGEN.PY < prev    next >
Encoding:
Python Source  |  2000-04-10  |  2.1 KB  |  82 lines

  1. """grammar generation stuff for sql.
  2.  
  3. This module does not bind any rule semantics, it
  4. just generates the parser data structures.
  5. """
  6.  
  7. ### interpretation functions and regexen for terminals
  8.  
  9. MARSHALFILE = "sql.mar"
  10.  
  11. import string
  12. alphanum = string.letters+string.digits + "_"
  13. userdefre = "[%s][%s]*" % (string.letters +"_", alphanum)
  14. commentre = "--.*"
  15.  
  16. def userdeffn(str):
  17.     from string import upper
  18.     return upper(str)
  19.     
  20. charstre = "'[^']*'"
  21.  
  22. def charstfn(str):
  23.     return str[1:-1]
  24.     
  25. #numlitre = "[%s][%s\.]*" % (string.digits, alphanum) # not really...
  26.  
  27. digits = string.digits
  28. # rely in python to filter out the good/bad/ugly
  29. intre = "[%s][%s.jJ]*" % (digits,digits)
  30. numlitre = "%s\([Ee][+-]?%s\)?" % (intre, intre)
  31.  
  32. def numlitfn(str):
  33.     """Note: this is "safe" because regex
  34.        filters out dangerous things."""
  35.     return eval(str)
  36.  
  37. def DeclareTerminals(Grammar):
  38.     Grammar.Addterm("user_defined_name", userdefre, userdeffn)
  39.     Grammar.Addterm("character_string_literal", charstre, charstfn)
  40.     Grammar.Addterm("numeric_literal", numlitre, numlitfn)
  41.     
  42. def BuildSQL(filename=MARSHALFILE):
  43.     import kjParseBuild
  44.     from sqlgram import sqlrules, nonterms, keywords, puncts
  45.     SQLG = kjParseBuild.NullCGrammar()
  46.     SQLG.SetCaseSensitivity(0)
  47.     DeclareTerminals(SQLG)
  48.     SQLG.Keywords(keywords)
  49.     SQLG.punct(puncts)
  50.     SQLG.Nonterms(nonterms)
  51.     SQLG.comments([commentre])
  52.     # should add comments
  53.     SQLG.Declarerules(sqlrules)
  54.     print "working..."
  55.     SQLG.Compile()
  56.     print "testing"
  57.     from sqlgtest import test
  58.     for x in test:
  59.         print SQLG.DoParse1(x)
  60.     print "dumping to", filename
  61.     outfile = open(filename, "wb")
  62.     SQLG.MarshalDump(outfile)
  63.     outfile.close()
  64.     return SQLG
  65.     
  66. def reloadSQLG(filename=MARSHALFILE):
  67.     """does not bind any interpretation functions."""
  68.     import kjParser
  69.     infile = open(filename, "rb")
  70.     SQLG = kjParser.UnMarshalGram(infile)
  71.     infile.close()
  72.     DeclareTerminals(SQLG)
  73.     return SQLG
  74.     
  75. def getSQL():
  76.     from sqlwhere import filename
  77.     return reloadSQLG(filename)
  78.     
  79.     
  80.  
  81.     
  82.